import {
  CallHandler,
  ExecutionContext,
  Injectable,
  NestInterceptor,
} from '@nestjs/common';
import { Observable, tap } from 'rxjs';

@Injectable()
export class LoggingInterceptor implements NestInterceptor {
  /**
   * 拦截器函数，用于在请求处理前后添加自定义逻辑
   * 测量并打印出请求从开始到被完全处理所花费的时间。
   * 这是性能监控和调试中常见的一个需求。
   * 通过使用NestJS的拦截器机制，可以轻松地在不修改业务逻辑代码的情况下添加这样的功能。
   * @param context 执行上下文对象
   * @param next 调用处理器函数
   * @returns 返回一个Observable对象，包含处理结果
   */
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    console.log('Before...');
    const now = Date.now();
    return next
      .handle()
      .pipe(tap(() => console.log(`After... ${Date.now() - now}ms`)));
  }
}
